perm filename MPRO[AI,JMC] blob sn#005443 filedate 1971-08-13 generic text, type T, neo UTF8
TITLE MPRO

;MOVE PROPOSERS FIRST VERSION

ORDMV:	TRNN FL,TIMR
	JRST NOTOD
	AOS MPCTR
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT#
NOTOD:	TRZ FL,FGMF+AFGM	;NOT IN FORCED GAME
	MOVE T1,LEVEL	;GET CURRENT LEVEL
	CAML T1,ENDLV	;HAVE WE GONE FAR ENOUGH
	TRO FL,FGMF	;SET FLAG
	ADDI T1,1
	CAML T1,ENDLV
	TRO FL,AFGM
	SETZM FGCNT#
	PUSHJ P,VULNC
	MOVE I,ULIM	;GET START OF POSSIBLE MOVES
EVME:	CAMG I,LLIM	;FAR ENOUGH?
	JRST ENDORD	;YES, FINISH UP
	MOVE MOVER,(I)	;GET MOVE
	TRNE FL,FGMF	;IN FORCED GAME?
	PUSHJ P,FGMR	;YES, EVALUATE
	PUSHJ P,EVR1	;NO, USE OTHER EVALUATOR
	PUSHJ P,FILL	;PUT MOVE INTO PROPER ORDER
	SOJA I,EVME	;NEXT MOVE

;THE VALUE GENERATOR

EVR1:	MOVEI CNT,0	;STARTING VALUE IS ENOUGH SO POS
	TRNE MOVER,EPSET	;CHECK FOR VALID PROMBT
	JRST NCAP	;NO VALID
	TRNE MOVER,PROMBT	;IS THERE A PROMOTION
	ADD CNT,PROMVL	;ADD PROMOTION VALUE
	TRNN MOVER,CAPBT	;IS IT A CAPTURE
	JRST NCAP	;NO
	TRNE MOVER,EPCAP	;IS IT EP
	JRST ISEPC	;YES, SPECIAL HANDELING
	LDB T1,[POINT 6,MOVER,35]	;GET DEST
	SKIPA T1,OCC(T1)	;WHO IS IT
ISEPC:	MOVE T1,EPMOVER	;GET CORRECT PIECE
	SKIPGE VULTBL(T1)	;VULNERABLE?
	JRST NCAP
CPGIN:	MOVE T1,KIND(T1)	;ADD IN VALUE
	ADD CNT,VALUE(T1)
	ADD CNT,CPVL	;YES, ADD IN VALUE
	LDB T1,[POINT 5,MOVER,29]
	MOVE T1,KIND(T1)
	ADD CNT,VL2(T1)		;FAVOR CAPTURE WITH LESS VALUABLE
	SOS FGCNT
NCAP:	MOVEM CNT,SVCNT#	;SAVE VALUE

;TIM@ OUT TO DEFINE A MACRO

	DEFINE SAVE (A)
	<IRP A <PUSH P,A>>

	SAVE <MOVER,I>
	TRNN FL,TIMR
	JRST NOTOD1
	AOS MPPCTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVE T1,TMPUT
	MOVEM T1,STMPUT#
NOTOD1:	JSR GOMOV
	TRNN FL,TIMR
	JRST NOTOD2
	MOVE T1,TMPUT
	SUB T1,STMPUT
	ADDM T1,TMMP
	ADDM T1,TMPMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT
NOTOD2:	MOVE CNT,SVCNT	;RETRIEVE COUNT
OCKGIN:	PUSHJ P,VULNC2	;NOW DO CALCS AGAIN
	MOVE T1,COLOR	;WHAT COLOR MOVED
	IORI T1,4	;SEE IF IN CHECK
	PUSHJ P,CAT	;GO LOOK
	SKIPLE NATRS	;HOW MANY?
	JRST INCK	;WE ARE IN CHECK, BAD MOVE
	XORI T1,20	;HOW ABOUT HIM?
	PUSHJ P,CAT
	SKIPG T2,NATRS	;ANY ATTACKERS
	JRST NOCKS	;NO, NOT IN CHECK
	CAIG T2,1	;ONE OR MORE?
	JRST CKSE1	;ONLY ONE, CHECK FOR SAFE CHECK
	ADD CNT,DCKVL	;ADD VALUE FOR DOUBLE CHECK
	SOS FGCNT
	JRST NOCKS	;AND GO ON
CKSE1:	MOVE T1,ATKRS	;GET THE CHECKR
	SKIPL VULT2(T1)	;VULNERABLE?
	JRST NOCKS	;YES
	ADD CNT,SCKVL	;NO, CREDIT MOVE
REPEAT 0,<NOCKS:	HRLZI T1,-20	;SEE IF ANSWERS THREAT
	HRR T1,COLOR	;LOOK AT OUR PIECES
CKANS:	SKIPGE VULTBL(T1)	;WAS IT VULNERABLE
	JRST NOAST	;NO, DOES NOT ANSWER THREAT
	SKIPL VULT2(T1)	;IS HE NOW?
	JRST NOAST	;YES, NO HELP HERE
	ADD CNT,ATHVL	;NO, MOVE ANSWERS THREAT
	JRST CKTH	;NOW TRY NEXT REASON FOR GOOD MOVE
NOAST:	AOBJN T1,CKANS	;TRY ANOTHER PIECE

CKTH:	TRZ FL,DTHCK	;ZERO THE DOUBLE THREAT FLAG
	HRLZI T1,-20	;20 PIECES
	HRR T1,COLOR	;GET COLOR
	XORI T1,20	;LOOK AT HIS PIECES
CKTHL:	SKIPL VULTBL(T1)	;WAS IT VULNERABLE
	JRST NOTH	;YES, FORGIP IT
	SKIPGE VULT2(T1)	;IS HE NOW?
	JRST NOTH	;NO, GO ON
	TROE FL,DTHCK	;SINGLE OR DOUBLE?
	JRST DBLVL	;DOUBLE, OH BOY, OH BOY!
	ADD CNT,THRVL	;ONLY SINGLE
NOTH:	AOBJN T1,CKTHL	;TRY FOR DOUBLE
	SKIPA
DBLVL:	ADD CNT,DTHRVL	;YES, DOUBLE THREAT
	HRLZI T1,-20	;SEE IF WE HAVE LET A NEW THREAT DEVELOP
	HRR T1,COLOR
CKNTH:	SKIPL VULTBL(T1)
	JRST NONTH
	SKIPL VULT2(T1)
	JRST SBNTV	;YES, GO FIX CNT
NONTH:	AOBJN T1,CKNTH
	SKIPA
SBNTV:	SUB CNT,NTHRT	;BAD MOVE
	ANDI T1,37	;NOW LOOK AT HIS PIECES
	HRLZI T1,-20
CKLOS:	SKIPGE VULTBL(T1)	;HAS A THREAT TO HIM GONE AWAY
	JRST NOLOS
	SKIPGE VULT2(T1)
	JRST SBLOS	;YES
NOLOS:	AOBJN T1,CKLOS
	SKIPA
SBLOS:	SUB CNT,LOSV	;BAD MOVE
>
NOCKS:	HRLZI T1,-20
	HRR T1,COLOR
CKTH1:	ADD CNT,VULTBL(T1)
	SUB CNT,VULT2(T1)
	AOBJN T1,CKTH1
	HRLZI T1,-20
	HRR T1,COLOR
	XORI T1,20
CKTH2:	ADD CNT,VULT2(T1)
	SUB CNT,VULTBL(T1)
	AOBJN T1,CKTH2
	MOVEM CNT,SVCNT	;THATS ALL FOR NOW
	TRNN FL,TIMR
	JRST NOTOD3
	AOS MPPCTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVE T1,TMPUT
	MOVEM T1,STMPUT
NOTOD3:	JSR UNMOV	;RETRACT
	TRNN FL,TIMR
	JRST NOTOD4
	MOVE T1,TMPUT
	SUB T1,STMPUT
	ADDM T1,TMMP
	ADDM T1,TMPMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT

;ANOTHER MACRO
	DEFINE UNSAVE (A)
	<IRP A <POP P,A>>

NOTOD4:	UNSAVE <I,MOVER>
	MOVE CNT,SVCNT
	ADD CNT,POSMK
	POPJ P,

;ROUTINE TO PUT MOVES IN PROPER ORDER

FILL:	TRNN FL,TIMR
	JRST NOSEC
	AOS FCTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVFIL#
NOSEC:	MOVE J,ULIM	;ST@RT SEARCH FOR CORRECT PLACE
INSLP:	CAMN J,I	;AT END OF SEARCH?
	JRST INBLT	;YES, INSERT
	HLRE T1,(J)	;GET VALUE OF THAT MOVE
	CAML T1,CNT	;INSERT HERE?
	SOJA J,INSLP	;NO, TRY NEXT
INBLT:	MOVSS CNT	;PUT IN LEFT HALF
	HRR CNT,(I)	;GET PROPER MOVE
	HRLI T1,1(I)	;SET UP BLT
	HRR T1,I
	BLT T1,(J)	;BLT IT
	MOVEM CNT,(J)	;PUT IN MOVE
	TRNN FL,TIMR
	POPJ P,
	PUSH P,SVFIL
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	ADDM T1,FTMR
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT
	POPJ P,		;AND RETURN

;HERE IF IN CHECK

INCK:	SKIPE CNT
	AOS FGCNT
	JSR UNMOV	;RETRACT MOVE
	UNSAVE <I,MOVER>
	MOVNI CNT,1	;CNT IS -1 FOR THIS MOVE
	POPJ P,		;RETURN

;THE END OF ORDERING

ENDORD:	MOVE T1,LLIM	;YES
ELCK:	CAMN T1,ULIM	;ELIMINATE CHECKS
	JRST ENDAL3	;ALL DONE IF SO
	HLRE T2,1(T1)
	JUMPG T2,ECK1
	SKIPGE T2
	AOS LLIM2
	AOJA T1,ELCK	;YES, TRY NEXT ONE BACK
ECK1:	TRNE FL,FGMF
	JRST NOSHRT
	MOVE T2,LEVEL
	MOVN T2,NMV(T2)
	CAMLE T2,FGCNT
	MOVE T2,FGCNT
	ADD T2,ULIM
	CAMLE T2,T1
	MOVE T1,T2
NOSHRT:	PUSH P,T1	;SAVE POINTER
	SETZM UP#	;ZERO COUNTERS
	SETZM DOWN#
	SKIPA
KPSM:	AOS UP		;INDEX UP COUNTER
	CAMN T1,LLIM	;ARE ALL INCLUDED?
	JRST ENDAL	;YES, MUST BE DONE
	HLRZ T2,(T1)	;GET VALUE
	HLRZ T3,1(T1)	;AND OF PREVIOUS
	CAMN T2,T3	;SAME?
	SOJA T1,KPSM	;KEEP IT ANYWAY
ENDAL:	PUSH P,T1	;SAVE NEW VALUE
	MOVE T1,-1(P)	;GET BACK OLD VALUE
KPSM2:	HLRZ T2,(T1)	;GET VALUE
	HLRZ T3,1(T1)	;SAME?
	CAME T2,T3
	JRST ENDAL2
	AOS DOWN	;INCLUDE FEWER
	ADDI T1,1
	CAME T1,ULIM	;REACHED LIMIT?
	JRST KPSM2	;NO
ENDAL2:	EXCH T1,-1(P)	;GET ORIGINAL
	MOVE T2,DOWN	;GET DOWN COUNT
	CAIG T2,2	;IS IT 2 OR FEWER
	MOVE T1,-1(P)	;IF SO LOOK AT FEWER
	MOVE T2,UP	;NOW SAME FOR UP
	CAIG T2,2
	MOVE T1,(P)
	SUB P,[XWD 2,2]	;SYNC STACK
ENDAL3:	MOVEM T1,LLIM	;THATS IT
	TRNN FL,TIMR
	JRST NOTOD9
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
NOTOD9:	POPJ P,		;RETURN
;SUBROUTINES USED BY ABOVE

VULNC:	TRNN FL,TIMR
	JRST NOSEC2
	AOS VCTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVVNC#
NOSEC2:	SETOM VULTBL	;DO VULNERABLE CALC ON ALL PIECES
	MOVE T1,[XWD VULTBL,VULTBL+1]	;ZERO TABLE
	BLT T1,VULTBL+37
	HRLZI T1,-40
	PUSHJ P,VULC
	MOVEM T3,VULTBL(T1)	;YES, SET VUL VALUE
	AOBJN T1,.-2	;NEXT PIECE
	SETOM VULTBL+4
	SETOM VULTBL+24
	TRNN FL,TIMR
	POPJ P,
	PUSH P,SVVNC
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	ADDM T1,VTMR
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT
	POPJ P,		;DONE

VULNC2:	TRNN FL,TIMR
	JRST NOSEC3
	AOS V2CTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVVNC2#
NOSEC3:	SETOM VULT2	;SIMILAR TO ABOVE
	MOVE T1,[XWD VULT2,VULT2+1]
	BLT T1,VULT2+37
	HRLZI T1,-40
	PUSHJ P,VULC
	MOVEM T3,VULT2(T1)
	AOBJN T1,.-2
	SETOM VULT2+4
	SETOM VULT2+24
	TRNN FL,TIMR
	POPJ P,
	PUSH P,SVVNC2
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	ADDM T1,V2TMR
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT
	POPJ P,

VULC:	PUSHJ P,CAT	;CHECK ATTACKS
	SKIPN T3,NATRS	;ATTACKERS?
	JRST CPOPJ1	;NO, NOT VULNERABLE
	MOVEI T4,-1	;FIND LEAST VALUABLE ATACKERS
	MOVEI T5,-1
FLVAT:	MOVE T6,ATKRS-1(T3)	;GET ATACKER
	MOVE T6,KIND(T6)	;GET KIND
	MOVE T6,VALUE(T6)	;AND VALUE
	CAMG T4,T6	;MORE VALUABLE
	JRST NTAT	;TRY NEXT
	MOVE T4,T6	;SHIFT ATACKERS
	CAMG T4,T5
	EXCH T4,T5	;KEEP T4 THE LARGER
NTAT:	SOJG T3,FLVAT	;TRY NEXT
	MOVE T3,NDEF	;NOW SIMILAR FOR DEF@NDERS
	MOVEI T2,-1
FLVDF:	MOVE T6,DEFRS-1(T3)
	MOVE T6,KIND(T6)
	MOVE T6,VALUE(T6)
	CAMLE T2,T6
	MOVE T2,T6
	SOJG T3,FLVDF
	MOVE T3,KIND(T1)	;GET VALUE
	MOVE T3,VALUE(T3)
	SKIPN NDEF	;CHECK FOR DEFNEDERS
	POPJ P,		;VALUE IS PIECE
	SOSE NATRS	;ONE OR MORE?
	JRST ATK2S	;ONLY 1
	SUB T3,T5	;VALUE IS PC-ATKR
	JUMPL T3,CPOPJ1	;NOT, VULN IF NED
	POPJ P,
ATK2S:	SOSE NDEF	;HOW MANY DEFNEDERS
	JRST DEF2	;AT LEAST 2
	CAMLE T2,T5	;IF DEF MORE VAL THAN ATK THE VALUE IS PC
	POPJ P,
	ADD T3,T2
	SUB T3,T5	;VALUE IS PC+DEF-ATKR
	JUMPL T3,CPOPJ1
	POPJ P,
DEF2:	MOVE T6,T5
	ADD T5,T4
	CAMLE T2,T5	;IF DEF MOR VAL THEN BOTH ATKRS THEN PC
	POPJ P,
	SUB T3,T6
	CAML T4,T2	;IF ATK2 MORE VAL THAN DEF  THEN PC-ATKR1
	JRST DEF3
	ADD T3,T2
	SUB T3,T4	;PC+DEF-ATK1-ATK2 IS VALUE
DEF3:	SKIPGE T3
CPOPJ1:	AOS(P)	;NOT VUL
	POPJ P,

CAT:	SETZM NDEF#
	SETZM NATRS#	;CLEAR NUMBER OF DEENDERSAND ATACKERS
	SKIPGE T2,LOC(T1)	;IS IT ON THE BOARD
	POPJ P,	;NO ATACKS, DO DEFENSES
	HRLI T2,-20	;20 DIRECTIONS
BRLP:	SKIPGE T3,JBEAR(T2)	;ANYONE BEARING ON IT
	JRST NOBR	;NO
	TLNE T3,300000	;PSEUDO?
	JRST NOBR
	MOVE T4,T3	;YES, CHECK COLOR
	XOR T4,T1
	TRNE T4,20	;SAME?
	JRST ATK	;NO, AN ATTACK
	AOS T4,NDEF	;YES, A DEFENSE
	MOVEM T3,DEFRS-1(T4)	;SAVE
	JRST NOBR
ATK:	AOS T4,NATRS	;SAME FOR ATTACK
	MOVEM T3,ATKRS-1(T4)
NOBR:	ADDI T2,77	;DIRECION INCREMENT IS ADD 100
	AOBJN T2,BRLP	;NEXT ONE
	POPJ P,		;DONE
;THE FORCED GAME ROUTINE

FGMR:	AOS (P)	;SEE CALL
	MOVEI CNT,0
REPEAT 0,<	MOVE T1,WCOUNT	;GIVE UP IF VALUE IS LESS THAN ALPHA
	SUB T1,BCOUNT
	LSH T1,1
	SKIPE COLOR
	MOVNS T1	;GOT VALUE
	CAMGE T1,ALPHA
	POPJ P,
>
	TRNN MOVER,EPSET	;INVALID IF THIS IS ON
	TRNN MOVER,CAPBT	;A CAPTURE?
	JRST NCAPF
	TRNE MOVER,EPCAP	;IS IT EP
	JRST ISEP2
	LDB T1,[POINT 6,MOVER,35]	;GET DEST
	SKIPA T1,OCC(T1)		;GET OCC
ISEP2:	MOVE T1,EPMOVER	;FOR EP CAPTURES
	PUSHJ P,VULC	;CHECK VULNERABLE
	JRST CPGIN	;GOOD ENOUGH
NCAPF:	TRZ FL,INCKF	;ARE WE IN CHECK
	PUSHJ P,CKCK
	TRO FL,INCKF	;YES, ANYTHING GETS US OUT IS GOOD
	MOVEM CNT,SVCNT	;SAVE THE V↓LUE
	SAVE <MOVER,I>
	TRNN FL,TIMR
	JRST NOTOD5
	AOS MPPCTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVE T1,TMPUT
	MOVEM T1,STMPUT
NOTOD5:	JSR GOMOV	;MAKE THE MOVE
	TRNN FL,TIMR
	JRST NOTOD6
	MOVE T1,TMPUT
	SUB T1,STMPUT
	ADDM T1,TMMP
	ADDM T1,TMPMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT
NOTOD6:	MOVE CNT,SVCNT
	PUSHJ P,CKCK	;IN CHECK?
	JRST INCK	;YES, SAME ROUTINE SINCE EXIT ALREADY INCREMENTED
	TRZE FL,INCKF	;WERE WE IN CHECK
	JRST OCKGIN	;EVALUATE
	SKIPG CKLEV	;CHECKS STILL GOOD?
	JRST NOCKC	;NO, GO ON
	MOVEI T1,4	;TRY HIS KING
	IOR T1,COLOR
	XORI T1,20
	PUSHJ P,CAT	;CHECK ATTACKS
	SKIPG T2,NATRS	;HOW MANY?
	JRST NOCKC	;NONE
	SOJG T2,OCKGIN	;IF MORE THAN 1 GOOD, EVALUATE
	MOVE T1,ATKRS	;WHO IS IT
	PUSHJ P,VULC	;VULNERABLE?
	JRST NOCKC	;YES, FORGET IT
	JRST OCKGIN	;GO EVALUATE
NOCKC:	MOVEM CNT,SVCNT	;RETRACT MOVE
	TRNN FL,TIMR
	JRST NOTOD7
	AOS MPPCTR
	PUSH P,SVMMPT
	PUSHJ P,TIMIT
	POP P,T1
	ADDM T1,TMMP
	MOVE T1,TMPUT
	MOVEM T1,STMPUT
NOTOD7:	JSR UNMOV
	TRNN FL,TIMR
	JRST NOTOD8
	MOVE T1,TMPUT
	SUB T1,STMPUT
	ADDM T1,TMMP
	ADDM T1,TMPMP
	MOVEI T1,0
	CALLI T1,31
	CONI 730,SVMMPT
NOTOD8:	UNSAVE <I,MOVER>
	MOVE CNT,SVCNT
	POPJ P,		;AND RETURN

;THE EVALUATOR

EVALIT:	PUSHJ P,CKCK	;IN CHECK?
	JRST RETMI	;VERY BAD
	MOVE T1,WCOUNT
	SUB T1,BCOUNT	;GET DIFFERENCE
	LSH T1,1	;*2 FOR FRACTIONAL ALPHA-BETA
	SKIPE COLOR	;WHO IS IT?
	MOVNS T1	;INVERT IF BLACK
	POPJ P,

RETMI:	HRLZI T1,500000	;VERY BAD MOVE
	POPJ P,

	INTERNAL ORDMV,EVALIT
	INTERNAL ENDLV,PROMVL,CPVL,DCKVL,SCKVL,ATHVL,THRVL
	INTERNAL DTHRVL,OUTCKL,POSMK,NMV

	EXTERNAL LEVEL,ULIM,LLIM,OCC,EPMOVER,GOMOV,COLOR,UNMOV,LOC,JBEAR
	EXTERNAL CKLEV,CKCK,WCOUNT,BCOUNT,KIND,VALUE,ALPHA,LLIM2
	EXTERNAL TIMIT,TMMP,TMPMP,TMPUT,MPPCTR,MPCTR,FTMR,VTMR,V2TMR,VCTMR
	EXTERNAL V2CTR,VCTR,FCTR

ENDLV:	4
PROMVL:	20
CPVL:	200
DCKVL:	200
SCKVL:	100
ATHVL: 4
THRVL:	2
DTHRVL:	10
OUTCKL:	200
LOSV:	2
NTHRT:	4
POSMK:	200
VL2:	EXP 3,1,2,2,0,-1	;VALUES FOR CAPTURING PIECE
VULTBL:	BLOCK 40
VULT2:	BLOCK 40
NMV:	REPEAT 30,<EXP 10>
DEFRS:	BLOCK 20
ATKRS:	BLOCK 20
FGMF==200
AFGM==2000
DTHCK==400
INCKF==1000
TIMR==4000

EPSET==400000
EPCAP==10000
CAPBT==4000
PROMBT==200000
FL=0
P=17
MOVER=16
I=7
J=10
T1=1
T2=2
T3=3
T4=4
T5=5
T6=6
CNT=11

END